<?php
/**
 * 后台基础控制器
 * @author maniac
 */
namespace app\manage\controller;

use app\facade\Options;
use app\common\model\Users;
use app\common\model\UserRoles;

class Base extends \think\Controller
{
    public function initialize()
    {
        $controller = request()->controller();
        $action     = request()->action();
        $userid     = session('userid', '', session_prefix());
        $rnd        = session('rnd', '', session_prefix());
        if ($controller == 'Login' && $action != 'quit' && $userid) {
            // 登录控制器
            $this->redirect('/manage/index/index');
        } elseif ($controller != 'Login' && !$userid) {
            echo "<script>location.href='/manage';</script>";
            die;
            //$this->redirect('/manage');
        }
        $is_auth = true;
        if ($controller != 'Login' && $controller != 'Index' && !request()->isPost()) {
            $is_auth = $this->auth(request()->module(), $controller, $action);
        }
        
        // 查询当前用户登录随机码是否与 session 中的随机码相同，如果不相同强制退出当前登录用户。
        $user           = Users::field('id,role_id,username,admin_columns,rnd,status')->where('id', $userid)->find();
        // 用户不存在标识
        $user_exists    = false;
        // 用户被禁用标识
        $user_forbidden = false;
        // 强制退出标识
        $quit_force     = false;
        if (!$user) {
            $user_exists = true;
        } elseif (!$user['status']) {
            $user_forbidden = true;
        } elseif ($user['rnd'] != $rnd) {
            $quit_force = true;
        }
        if ($controller == 'Login') {
            $user_exists = false;
        }
        
        if ($user_exists || $user_forbidden || $quit_force) {
            session(null, session_prefix());
        }
        $url = isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'index';
        $site_info = unserialize(Options::option('site_info'));
        $encrypt_key = config('site.aes_key');
        $this->assign('site_info', $site_info);
        $this->assign('encrypt_key', $encrypt_key);
        $this->assign('user_exists', $user_exists);
        $this->assign('user_forbidden', $user_forbidden);
        $this->assign('quit_force', $quit_force);
        $this->assign('is_auth', $is_auth);
        $this->assign('url', $url);
    }

    /**
     * 首页列表
     */
    public function index()
    {
        // 当前页数
        $page   = input('get.page/d', 1);
        // 模型
        $model  = $this->getModel();
        // 查询条件
        $where  = $this->where();

        // 排序条件
        $order  = $this->order();
        // 数据总数
        $count  = $model::where($where)->count();
        // 每页条数
        $limit  = $this->limit();
        // 分页条件
        $offset = $this->offset($page, $limit);
        //获取字段
        $field = $this->getField()?$this->getField():true;

        // 分页数据
        $data   = $model::field($field)->where($where)->order($order)->limit($offset)->select();

        // 模板
        $template = $this->indexTemplate();
        
        // 列表附加
        $this->indexAttach($data);

        return $this->fetch($template, [
            'page'  => $page,
            'count' => $count,
            'limit' => $limit,
            'data'  => $data,
        ]);
    }
    
    /**
     * 添加/编辑
     */
    public function add()
    {
        $id    = input('param.id/d', 0);
        // 模型
        $model = $this->getModel();
        //获取字段
        $field = $this->getAddField()?$this->getAddField():true;

        $info  = $model::field($field)->where('id', $id)->find();
     
//        $info  = $model::field($field)->get($id);
        // 模板
        $template = $this->addTemplate();
        // 添加/编辑页面附加
        $this->addAttach($info);

        return $this->fetch($template, [
            'info' => $info,
        ]);
    }

    /**
     * 获取自定义字段
     */
    public function getField(){
        return "";
    }
    
    /**
     * 获取自定义字段
     */
    public function getAddField(){
        return "";
    }
    /**
     * 获取模型
     */
    public function getModel()
    {
        return 'app\common\model\\' . request()->controller();
    }
    
    /**
     * 组合 where 查询条件
     */
    public function where()
    {
        return [];
    }
    
    /**
     * 排序条件
     */
    public function order()
    {
        $controller = request()->controller();
        $fields     = get_fields($controller);
        $order      = '';
        if (in_array('list_order', $fields)) {
            $order = 'list_order DESC,';
        }
        $order .= 'id DESC';
        return $order;
    }
    
    /**
     * 每页条数
     */
    public function limit()
    {
        return config('site.default_admin_limit');
    }
    
    /**
     * limit 分页条件
     * @param int $page 当前页数
     */
    public function offset($page, $limit)
    {
        // 分页数据偏移量
        $offset = ($page - 1)*$limit;
        return $offset.','.$limit;
    }
    
    /**
     * 列表页模板
     */
    public function indexTemplate()
    {
        return '';
    }
    
    /**
     * 添加/编辑页面模板
     */
    public function addTemplate()
    {
        return '';
    }
    
    /**
     * 首页补充
     * @param array $data 列表数据
     */
    public function indexAttach($data)
    {

    }
    
    /**
     * 添加/编辑补充
     * @param array $info 要编辑的数据
     */
    public function addAttach($info)
    {

    }
    
    /**
     * 处理 form 表单提交
     */
    public function action()
    {
        if (!request()->isPost()) return j(1, '非法提交');
        
        $data   = input('post.');

        // 操作标识
        $action = $data['do_action'];
        unset($data['do_action']);
        
        $model  = request()->module() ? model(request()->controller(), 'logic') : '';
        if ($model) {
            try {
                if ($action == 'save') {
                    // 添加/编辑操作时，重组提交数据。
                    $data = $model->recombine($data);
                }
                // 格式化权限验证操作
                $authAction = $this->formatAction($action, $data);
                $authResult = $this->auth(request()->module(), request()->controller(), $authAction);
                if ($authResult === false) {
                    return j(1, '您没有权限执行此操作');
                }
                // 执行逻辑层操作

                $result = $model->$action($data);

                if ($result !== false) {
                    // 清除当前控制器标识的所有缓存数据
                    \think\facade\Cache::clear(request()->controller());

                    return j(0, '操作成功');
                }
                return j(1, '操作失败，未知错误');
            } catch (\Exception $e) {
                return j(1, $e->getMessage().'--FILE: '.$e->getFile().'--LINE: '.$e->getLine());
                // return j(1, $e->getMessage());
            }
        }
        return j(1, '操作失败，未知错误');
    }
    
    /**
     * 权限验证
     * @param string $module     模块 id
     * @param string $controller 控制器 id
     * @param string $action     操作 id
     */
    public function auth($module, $controller, $action)
    {
        $roleId = session('role_id', '', session_prefix());
        if ($roleId) {
            if ($roleId == 1) return true;
            $uri  = '/'.parse_model_name($module).'/'.parse_model_name($controller).'/'.parse_model_name($action);
            $role = UserRoles::field('authorities')->where('id', $roleId)->find();
            if (in_array($uri, $role['authorities'])) {
                return true;
            } elseif (strpos(implode(',', $role['authorities']), ','.$uri.'?') !== false) {
                return true;
            } else {
                return false;
            }
        }
    }
    //获取当前用户角色类型
    public function UserType(){
        $userid     = session('userid', '', session_prefix());
        return Users::where("id",$userid)->value('type');
    }
    //获取当前用户所属店铺
    public function stores_id(){
        $userid     = session('userid', '', session_prefix());
        return Users::where("id",$userid)->value('stores_id');
    }
    /**
     * 格式化权限验证操作
     * @param  string $action 操作标识
     * @param  array  $data   请求的信息
     */
    private function formatAction($action, $data)
    {
        if ($action == 'save') {
            // 添加/编辑
            if (isset($data['id']) && $data['id']) {
                // 编辑
                $action = 'update';
            } elseif (isset($data['id']) && !$data['id']) {
                // 添加
                $action = 'add';
            }
        } elseif ($action == 'delete') {
            // 删除
            if (!isset($data['id']) || (isset($data['id']) && is_array($data['id']))) {
                $action = 'batch_delete';
            } elseif (isset($data['id']) && is_numeric($data['id'])) {
                $action = 'delete';
            }
        } elseif ($action == 'listOrder') {
            // 排序
            $action = 'list_order';
        }
        return $action;
    }
}
